package com.vcens.yzpay.socket;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.vcens.yzpay.config.WebSocketConfig;
import com.vcens.yzpay.service.IPayService;
import com.youzan.open.sdk.client.auth.Token;
import com.youzan.open.sdk.gen.v3_0_0.model.YouzanPayQrcodeCreateResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;

@ServerEndpoint(value = "/paySocket", configurator = WebSocketConfig.class)
@Component
public class WebSocket {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private IPayService payService;//这里需要在WebSocketConfig中配置，否则无法注入资源

    private Session session;

    /**
     * 连接建立
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
    }

    /**
     * 响应客户端消息
     *
     * @param message 客户端数据
     */
    @OnMessage
    public String onMessage(String message) {
        try {
            JSONObject jsonObject = JSONObject.parseObject(message);
            Map<String, String> payInfo = Maps.newHashMap();
            payInfo.put("payReason", jsonObject.get("payReason").toString());
            String amount = Double.parseDouble(jsonObject.get("amount").toString()) * 100 + "";
            //有赞后台按 分 进行计算，这里* 100 代表按元计算
            payInfo.put("amount", amount);
            /*
                二维码类型.
                QR_TYPE_FIXED_BY_PERSON ：无金额二维码，扫码后用户需自己输入金额；//官方文档有写这个类型，但是使用时会报出二维码类型非法的错误
                QR_TYPE_NOLIMIT ： 确定金额二维码，可以重复支付;
                QR_TYPE_DYNAMIC：确定金额二维码，只能被支付一次
            */
            payInfo.put("qr_type", "QR_TYPE_DYNAMIC");
            YouzanPayQrcodeCreateResult qrInfo = payService.createQrInfo(
                    new Token(payService.getAccessToken().get("access_token").toString()), payInfo);

            Map<String, Object> result = Maps.newHashMap();
            result.put("code", 200);
            result.put("status", "GET_QR_CODE");
            result.put("qrCode", qrInfo.getQrCode());
            result.put("msg", "请求成功");
            return JSONObject.toJSONString(result);
        } catch (Exception e) {
            logger.error("WebSocket:onMessage 执行异常", e);
        }
        return null;
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        logger.error(session.getId() + ":" + error.getMessage());
    }

    /**
     * 服务器主动推送消息
     */
    public void sendMessage(String message) {
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (Exception e) {
            logger.error("WebSocket:sendMessage 推送消息异常", e);
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
    }
}